package jsave.action;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import jsave.bo.Demande;
import jsave.conf.Configurations;
import jsave.exception.JSaveArretSauvegarde;
import jsave.exception.JSaveException;
import jsave.tree.FileNode;
import jsave.util.Console;
import jsave.util.Conversion;
import jsave.util.Utilitaire;

import org.apache.log4j.Logger;

public class ActionDemander extends Action {

	private static final Logger log = Logger.getLogger(ActionDemander.class);

	protected List<Demande> demandes = null;

	public ActionDemander(int typeAction) {

		super();

		demandes = new ArrayList<Demande>();

		if (typeAction == Action.ACTION_A || typeAction == Action.ACTION_B
				|| typeAction == Action.ACTION_C
				|| typeAction == Action.ACTION_D) {
			this.typeAction = typeAction;
		} else {
			log.error("ERREUR - Le type d'action '" + typeAction
					+ "' ne correspond pas a l'action 'ActionDemander' ");
		}
	}

	public void executerAllDemandes() throws JSaveArretSauvegarde {

		File s = null;
		File d = null;

		for (int i = 0; i < demandes.size(); i++) {

			s = demandes.get(i).getFichierSource();
			d = demandes.get(i).getFichierDestination();

			if (typeAction == ACTION_A) {

				System.out
						.println("Le fichier existe dans la source mais pas dans la destination.");
				System.out.println("  Fichier : " + s.getPath());
				System.out
						.print("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : ");
				BufferedReader entree = new BufferedReader(
						new InputStreamReader(System.in));
				Configurations.getInstance().getConfigCourante().getChrono()
						.pause();

				String reponse = null;
				try {
					reponse = entree.readLine();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
					System.exit(1);
				}

				Configurations.getInstance().getConfigCourante().getChrono()
						.reprendre();
				if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
					throw new JSaveArretSauvegarde();
				}
				if (reponse.endsWith("c") || reponse.endsWith("COPIER")) {
					if (s.isDirectory())
						creerDossier(d);
					else
						ajouterFichier(s, d);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionA(new ActionCopier(ACTION_A));
					}
				} else if (reponse.endsWith("s")
						|| reponse.endsWith("SUPPRIMER")) {
					if (s.isDirectory())
						supprimerDossier(s);
					else {
						supprimerFichier(s);
					}

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionA(new ActionSupprimer(ACTION_A));
					}

				} else {
					// Cas par defaut : ignorer
					Console.logInfo("IG - " + s.getPath() + " [A]");
					if (s.isDirectory()) {
						nbDossiersIgnores++;
					} else {
						nbFichiersIgnores++;
					}

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionA(new ActionIgnorer(ACTION_A));
					}
				}

			} else if (typeAction == ACTION_B) {

				System.out
						.println("Le fichier existe dans la destination mais pas dans la source.");
				System.out.println("  Fichier : " + d.getPath());
				System.out
						.print("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : ");
				BufferedReader entree = new BufferedReader(
						new InputStreamReader(System.in));
				Configurations.getInstance().getConfigCourante().getChrono()
						.pause();

				String reponse = null;
				try {
					reponse = entree.readLine();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
					System.exit(1);
				}

				Configurations.getInstance().getConfigCourante().getChrono()
						.reprendre();

				if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
					throw new JSaveArretSauvegarde();
				}
				if (reponse.endsWith("c") || reponse.endsWith("COPIER")) {
					if (d.isDirectory())
						creerDossier(s);
					else
						ajouterFichier(d, s);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionB(new ActionCopier(ACTION_B));
					}

					return;
				}
				if (reponse.endsWith("s") || reponse.endsWith("SUPPRIMER")) {

					System.out
							.println("%% DEB : Suppression de " + d.getPath());

					if (d.isDirectory())
						supprimerDossier(d);
					else {
						supprimerFichier(d);
					}

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionB(new ActionSupprimer(ACTION_B));
					}

					return;
				}
				// Cas par defaut : ignorer
				Console.logInfo("IG - " + d.getPath() + " [B]");
				if (s.isDirectory()) {
					nbDossiersIgnores++;
				} else {
					nbFichiersIgnores++;
				}

				// Toujours pareil pour la suite
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante()
							.setActionB(new ActionIgnorer(ACTION_B));
				}

			} else if (typeAction == ACTION_C) {

				System.out
						.println("Le fichier existe dans la source et dans la destination mais la source est plus recente.");
				System.out.println("  Fichier     : " + s.getPath());
				System.out.println("  Source      : "
						+ Conversion.tailleOctets2String(s.length())
						+ "\tmodifie le "
						+ Utilitaire.getDateTemps(s.lastModified()));
				System.out.println("  Destination : "
						+ Conversion.tailleOctets2String(d.length())
						+ "\tmodifie le "
						+ Utilitaire.getDateTemps(d.lastModified()));
				System.out
						.print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : ");
				BufferedReader entree = new BufferedReader(
						new InputStreamReader(System.in));
				Configurations.getInstance().getConfigCourante().getChrono()
						.pause();

				String reponse = null;
				try {
					reponse = entree.readLine();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
					System.exit(1);
				}

				Configurations.getInstance().getConfigCourante().getChrono()
						.reprendre();
				if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
					throw new JSaveArretSauvegarde();
				}
				if (reponse.endsWith("ms") || reponse.endsWith("MAJS")) {
					Console.logInfo("MS - " + s.getPath());
					MAJFichier(d, s);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionC(new ActionMAJSource(ACTION_C));
					}

					return;
				}
				if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
					Console.logInfo("MD - " + d.getPath());
					MAJFichier(s, d);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionC(new ActionMAJDestination(ACTION_C));
					}

					return;
				}
				// Par defaut : ignorer
				Console.logInfo("IG - " + s.getPath() + " [C]");
				nbFichiersIgnores++;

				// Toujours pareil pour la suite
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante()
							.setActionC(new ActionIgnorer(ACTION_C));
				}

			} else /* ACTION_D */{

				System.out
						.println("Le fichier existe dans la source et dans la destination mais la destination est plus recente.");
				System.out.println("  Fichier      : " + s.getPath());
				System.out.println("  Source       : "
						+ Conversion.tailleOctets2String(s.length())
						+ "\tmodifie le "
						+ Utilitaire.getDateTemps(s.lastModified()));
				System.out.println("  Destination  : "
						+ Conversion.tailleOctets2String(d.length())
						+ "\tmodifie le "
						+ Utilitaire.getDateTemps(d.lastModified()));
				System.out
						.print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : ");
				BufferedReader entree = new BufferedReader(
						new InputStreamReader(System.in));
				Configurations.getInstance().getConfigCourante().getChrono()
						.pause();

				String reponse = null;
				try {
					reponse = entree.readLine();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
					System.exit(1);
				}

				Configurations.getInstance().getConfigCourante().getChrono()
						.reprendre();
				if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
					throw new JSaveArretSauvegarde();
				}
				if (reponse.endsWith("ms") || reponse.endsWith("MAJS")) {
					Console.logInfo("MS - " + s.getPath());
					MAJFichier(d, s);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionD(new ActionMAJSource(ACTION_D));
					}

					return;
				}
				if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
					Console.logInfo("MD - " + d.getPath());
					MAJFichier(s, d);

					// Toujours pareil pour la suite
					if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
						Configurations.getInstance().getConfigCourante()
								.setActionD(new ActionMAJDestination(ACTION_D));
					}

					return;
				}
				// cas par defaut : ignorer
				Console.logInfo("IG - " + d.getPath() + " [D]");
				nbFichiersIgnores++;

				// Toujours pareil pour la suite
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante()
							.setActionD(new ActionIgnorer(ACTION_D));
				}
			}
		}
	}

	public void executer(File s, File d) throws JSaveArretSauvegarde {

		demandes.add(new Demande(s, d));

		/*
		 * if (typeAction == ACTION_A) {
		 * 
		 * System.out
		 * .println("Le fichier existe dans la source mais pas dans la destination."
		 * ); System.out.println("  Fichier : " + s.getPath()); System.out
		 * .print
		 * ("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : "
		 * ); BufferedReader entree = new BufferedReader(new InputStreamReader(
		 * System.in));
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .pause();
		 * 
		 * String reponse = null; try { reponse = entree.readLine(); } catch
		 * (Exception e) { log.error(e.getMessage(), e); System.exit(1); }
		 * 
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .reprendre(); if (reponse.endsWith("a") || reponse.endsWith("ARRET"))
		 * { throw new JSaveArretSauvegarde(); } if (reponse.endsWith("c") ||
		 * reponse.endsWith("COPIER")) { if (s.isDirectory()) creerDossier(d);
		 * else ajouterFichier(s, d);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionA(new
		 * ActionCopier(ACTION_A)); }
		 * 
		 * return; } if (reponse.endsWith("s") || reponse.endsWith("SUPPRIMER"))
		 * { if (s.isDirectory()) supprimerDossier(s); else {
		 * supprimerFichier(s); }
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionA(new
		 * ActionSupprimer(ACTION_A)); }
		 * 
		 * return; } // Cas par defaut : ignorer Console.logInfo("IG - " +
		 * s.getPath() + " [A]"); if (s.isDirectory()) { nbDossiersIgnores++; }
		 * else { nbFichiersIgnores++; }
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante().setActionA( new
		 * ActionIgnorer(ACTION_A)); }
		 * 
		 * } else if (typeAction == ACTION_B) {
		 * 
		 * System.out
		 * .println("Le fichier existe dans la destination mais pas dans la source."
		 * ); System.out.println("  Fichier : " + d.getPath()); System.out
		 * .print
		 * ("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : "
		 * ); BufferedReader entree = new BufferedReader(new InputStreamReader(
		 * System.in));
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .pause();
		 * 
		 * String reponse = null; try { reponse = entree.readLine(); } catch
		 * (Exception e) { log.error(e.getMessage(), e); System.exit(1); }
		 * 
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .reprendre();
		 * 
		 * if (reponse.endsWith("a") || reponse.endsWith("ARRET")) { throw new
		 * JSaveArretSauvegarde(); } if (reponse.endsWith("c") ||
		 * reponse.endsWith("COPIER")) { if (d.isDirectory()) creerDossier(s);
		 * else ajouterFichier(d, s);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionB(new
		 * ActionCopier(ACTION_B)); }
		 * 
		 * return; } if (reponse.endsWith("s") || reponse.endsWith("SUPPRIMER"))
		 * {
		 * 
		 * System.out.println("%% DEB : Suppression de " + d.getPath());
		 * 
		 * if (d.isDirectory()) supprimerDossier(d); else { supprimerFichier(d);
		 * }
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionB(new
		 * ActionSupprimer(ACTION_B)); }
		 * 
		 * return; } // Cas par defaut : ignorer Console.logInfo("IG - " +
		 * d.getPath() + " [B]"); if (s.isDirectory()) { nbDossiersIgnores++; }
		 * else { nbFichiersIgnores++; }
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante().setActionB( new
		 * ActionIgnorer(ACTION_B)); }
		 * 
		 * } else if (typeAction == ACTION_C) {
		 * 
		 * System.out.println(
		 * "Le fichier existe dans la source et dans la destination mais la source est plus recente."
		 * ); System.out.println("  Fichier     : " + s.getPath());
		 * System.out.println("  Source      : " +
		 * Conversion.tailleOctets2String(s.length()) + "\tmodifie le " +
		 * Utilitaire.getDateTemps(s.lastModified()));
		 * System.out.println("  Destination : " +
		 * Conversion.tailleOctets2String(d.length()) + "\tmodifie le " +
		 * Utilitaire.getDateTemps(d.lastModified())); System.out
		 * .print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : "
		 * ); BufferedReader entree = new BufferedReader(new InputStreamReader(
		 * System.in));
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .pause();
		 * 
		 * String reponse = null; try { reponse = entree.readLine(); } catch
		 * (Exception e) { log.error(e.getMessage(), e); System.exit(1); }
		 * 
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .reprendre(); if (reponse.endsWith("a") || reponse.endsWith("ARRET"))
		 * { throw new JSaveArretSauvegarde(); } if (reponse.endsWith("ms") ||
		 * reponse.endsWith("MAJS")) { Console.logInfo("MS - " + s.getPath());
		 * MAJFichier(d, s);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionC(new
		 * ActionMAJSource(ACTION_C)); }
		 * 
		 * return; } if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
		 * Console.logInfo("MD - " + d.getPath()); MAJFichier(s, d);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionC(new
		 * ActionMAJDestination(ACTION_C)); }
		 * 
		 * return; } // Par defaut : ignorer Console.logInfo("IG - " +
		 * s.getPath() + " [C]"); nbFichiersIgnores++;
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante().setActionC( new
		 * ActionIgnorer(ACTION_C)); }
		 * 
		 * } else // ACTION_D {
		 * 
		 * System.out.println(
		 * "Le fichier existe dans la source et dans la destination mais la destination est plus recente."
		 * ); System.out.println("  Fichier      : " + s.getPath());
		 * System.out.println("  Source       : " +
		 * Conversion.tailleOctets2String(s.length()) + "\tmodifie le " +
		 * Utilitaire.getDateTemps(s.lastModified()));
		 * System.out.println("  Destination  : " +
		 * Conversion.tailleOctets2String(d.length()) + "\tmodifie le " +
		 * Utilitaire.getDateTemps(d.lastModified())); System.out
		 * .print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : "
		 * ); BufferedReader entree = new BufferedReader(new InputStreamReader(
		 * System.in));
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .pause();
		 * 
		 * String reponse = null; try { reponse = entree.readLine(); } catch
		 * (Exception e) { log.error(e.getMessage(), e); System.exit(1); }
		 * 
		 * Configurations.getInstance().getConfigCourante().getChrono()
		 * .reprendre(); if (reponse.endsWith("a") || reponse.endsWith("ARRET"))
		 * { throw new JSaveArretSauvegarde(); } if (reponse.endsWith("ms") ||
		 * reponse.endsWith("MAJS")) { Console.logInfo("MS - " + s.getPath());
		 * MAJFichier(d, s);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionD(new
		 * ActionMAJSource(ACTION_D)); }
		 * 
		 * return; } if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
		 * Console.logInfo("MD - " + d.getPath()); MAJFichier(s, d);
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante() .setActionD(new
		 * ActionMAJDestination(ACTION_D)); }
		 * 
		 * return; } // cas par defaut : ignorer Console.logInfo("IG - " +
		 * d.getPath() + " [D]"); nbFichiersIgnores++;
		 * 
		 * // Toujours pareil pour la suite if (reponse.startsWith("t") ||
		 * reponse.startsWith("TOUS")) {
		 * Configurations.getInstance().getConfigCourante().setActionD( new
		 * ActionIgnorer(ACTION_D)); } }
		 */
	}

	public String getNom() {
		return "DEMANDER";
	}

	@Override
	public void executer(String sourcePath, String destinatinoPath, FileNode n)
			throws JSaveException {
		throw new JSaveException("Methode non implementee");
	}
}
